#include "Motor.h"
#include "stm32f10x.h"

/**
 * @brief  初始化电机控制引脚
 * @param  无
 * @retval 无
 */
void Motor_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置所有电机控制引脚为推挽输出
    GPIO_InitStructure.GPIO_Pin = MOTOR_IN1_PIN | MOTOR_IN2_PIN | MOTOR_IN3_PIN | MOTOR_IN4_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 初始状态为停止
    Motor_Stop();
}

/**
 * @brief  控制所有电机向前运动
 * @param  无
 * @retval 无
 */
void Motor_Forward(void)
{
    // 左侧电机正转 (IN1=0, IN2=1) - 修正方向
    GPIO_ResetBits(MOTOR_IN1_GPIO, MOTOR_IN1_PIN);
    GPIO_SetBits(MOTOR_IN2_GPIO, MOTOR_IN2_PIN);

    // 右侧电机正转 (IN3=0, IN4=1) - 修正方向
    GPIO_ResetBits(MOTOR_IN3_GPIO, MOTOR_IN3_PIN);
    GPIO_SetBits(MOTOR_IN4_GPIO, MOTOR_IN4_PIN);
}

/**
 * @brief  控制所有电机向后运动
 * @param  无
 * @retval 无
 */
void Motor_Backward(void)
{
    // 左侧电机反转 (IN1=1, IN2=0) - 修正方向
    GPIO_SetBits(MOTOR_IN1_GPIO, MOTOR_IN1_PIN);
    GPIO_ResetBits(MOTOR_IN2_GPIO, MOTOR_IN2_PIN);

    // 右侧电机反转 (IN3=1, IN4=0) - 修正方向
    GPIO_SetBits(MOTOR_IN3_GPIO, MOTOR_IN3_PIN);
    GPIO_ResetBits(MOTOR_IN4_GPIO, MOTOR_IN4_PIN);
}

/**
 * @brief  控制小车左转
 * @param  无
 * @retval 无
 */
void Motor_TurnLeft(void)
{
    // 左侧电机反转 (IN1=1, IN2=0) - 修正方向
    GPIO_SetBits(MOTOR_IN1_GPIO, MOTOR_IN1_PIN);
    GPIO_ResetBits(MOTOR_IN2_GPIO, MOTOR_IN2_PIN);

    // 右侧电机正转 (IN3=0, IN4=1) - 修正方向
    GPIO_ResetBits(MOTOR_IN3_GPIO, MOTOR_IN3_PIN);
    GPIO_SetBits(MOTOR_IN4_GPIO, MOTOR_IN4_PIN);
}

/**
 * @brief  控制小车右转
 * @param  无
 * @retval 无
 */
void Motor_TurnRight(void)
{
    // 左侧电机正转 (IN1=0, IN2=1) - 修正方向
    GPIO_ResetBits(MOTOR_IN1_GPIO, MOTOR_IN1_PIN);
    GPIO_SetBits(MOTOR_IN2_GPIO, MOTOR_IN2_PIN);

    // 右侧电机反转 (IN3=1, IN4=0) - 修正方向
    GPIO_SetBits(MOTOR_IN3_GPIO, MOTOR_IN3_PIN);
    GPIO_ResetBits(MOTOR_IN4_GPIO, MOTOR_IN4_PIN);
}

/**
 * @brief  停止所有电机
 * @param  无
 * @retval 无
 */
void Motor_Stop(void)
{
    // 所有电机停止 (IN1=0, IN2=0, IN3=0, IN4=0)
    GPIO_ResetBits(MOTOR_IN1_GPIO, MOTOR_IN1_PIN);
    GPIO_ResetBits(MOTOR_IN2_GPIO, MOTOR_IN2_PIN);
    GPIO_ResetBits(MOTOR_IN3_GPIO, MOTOR_IN3_PIN);
    GPIO_ResetBits(MOTOR_IN4_GPIO, MOTOR_IN4_PIN);
}
